package com.yq.design.prototype;

import com.yq.design.prototype.deep.DeepClone;
import com.yq.design.prototype.simple.Sheep;

import java.io.IOException;
/***
 场景：系统需要建大量相似的对象，通过clone
 原理：要拷贝的原型实现Cloneable接口，重写Object提供的的clone()方法。
 Cloneable接口是一个标记接口，（标记接口是指该接口中没有任何内容，作用是给所有实现该接口的类做特殊标记，
 只有一个类重实现了Cloneable接口后，才有权利重写Object类的clone()，否则会出CloneNotSupportedException）
 浅拷贝和深拷贝的区别：
 浅拷贝：类的成员变量是基本数据类型时，直接复制值，是引用类型，复制引用地址。原值改变，拷贝的也改变
 深拷贝：是引用类型时，复制值并创建新的存储空间，
方式：1、重写clone方法实现深拷贝，2通过对象序列化实现深拷贝(推荐)
 */

/**
 * @ClassName PrototypeClient
 * @Description 原型模式
 * @Author yaoqiang
 * @Date 2021/3/10 13:09
 * @Version 1.0
 */
public class PrototypeClient {
    public static void main(String[] args) throws IOException {
        testSimple();
        testSimple2();
    }

    public static void  testSimple2() throws IOException {
        DeepClone deepClone=new DeepClone("tom");
        DeepClone deepClone2 = (DeepClone) deepClone.deepClone();

        System.out.println(deepClone2);
        System.out.println(deepClone.hashCode());
        System.out.println(deepClone2.hashCode());
    }

    public static void testSimple(){
        Sheep sheep=new Sheep("tom",1);
        sheep.setFriend(new Sheep("tomFriend",1));
        Sheep sheep2=(Sheep)sheep.clone();
        System.out.println(sheep2);
        System.out.println(sheep.hashCode());
        System.out.println(sheep2.hashCode());
    }



}
